package com.shun.gateway.action;

import com.shun.common.R;
import com.shun.gateway.msg.BizReqRSAMsg;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 过滤器测试学习
 *
 * @author lushaonan
 * @since 2021-08-17
 */
@Slf4j
@Controller
@RequestMapping("filter")
public class FilterAction {

    /**
     * 映射请求报文头
     * @param param1
     * @param param2
     * @return
     */
    @GetMapping("/map")
    public Mono<R> mapRequestHeader(@RequestHeader(value = "param1",required = false) String param1,
                                    @RequestHeader(value = "param2",required = false) String param2) {
       log.info("param1:{},param2:{}",param1,param2);
       return Mono.just(R.suc("请求头中资源映射"));
    }

    /**
     * 去掉请求报文头中的数据项
     * @param param1
     * @return
     */
    @GetMapping("/removeReqHeader")
    public Mono<R> removeReqHeader(@RequestHeader(value = "param1",required = false) String param1,
                                   @RequestHeader(value = "param2",required = false) String param2) {
        log.info("param1:{},param2:{}",param1,param2);
        return Mono.just(R.suc("去掉请求头中的信息!"));
    }

    /**
     * 转移跳转，根据返回码，但是返回码必须是30X开头
     * @return
     */
    @GetMapping("/redirectTo")
    @ResponseStatus(HttpStatus.MOVED_PERMANENTLY)
    public Mono<R> redirect() {
        return Mono.just(R.suc("指引跳转"));
    }

    /**
     * 转移跳转，根据返回码，但是返回码必须是30X开头
     * @return
     */
    @GetMapping("/rewritePath")
    public Mono<R> rewritePath() {
        return Mono.just(R.suc("重写路径！"));
    }

    /**
     * 去掉请求业务头中业务参数。
     * @return
     */
    @GetMapping("/removeReqParameter")
    public Mono<R> removeReqParameter(ServerWebExchange exchange, String name, String num) {
        log.info("name:{},num:{}",name,num);
        return Mono.just(R.suc("去掉请求业务中指定的业务参数！"));
    }

    /**
     * 重写应答业务头中Location参数。
     * @return
     */
    @GetMapping("/rewriteLocationResponseHeader")
    public Mono<R> rewriteLocationResponseHeader(ServerWebExchange exchange) {
        exchange.getResponse().getHeaders().set("Location","http://localhost:8080/v1/filter/rewriteLocationResponseHeader");
        return Mono.just(R.suc("重写应答业务头中Location参数！"));
    }

    /**
     * 重写应答业务头中业务参数。
     * @return
     */
    @GetMapping("/rewriteResponseHeader")
    public Mono<R> rewriteResponseHeader(ServerWebExchange exchange) {
        exchange.getResponse().getHeaders().set("X-Response-Red","password='12321312312312'");
        return Mono.just(R.suc("重写应答业务头中的业务参数！"));
    }

    /**
     * 安全通讯头设置中业务参数。
     * @return
     */
    @GetMapping("/secureHeaders")
    public Mono<R> secureHeaders() {
        return Mono.just(R.suc("安全通讯头设置中业务参数"));
    }

    /**
     * 设置path模块
     * @return
     */
    @GetMapping("/setPath")
    public Mono<R> setPath() {
        return Mono.just(R.suc("设置path模块"));
    }

    /**
     * 替换请求头中的业务字段
     * @return
     */
    @GetMapping("/setReqHeader")
    public Mono<R> setReqHeader(@RequestHeader("token") String token) {
        log.info("token:{}",token);
        return Mono.just(R.suc("替换请求头中的业务字段"));
    }

    /**
     * 替换应答头中的业务字段
     * @return
     */
    @GetMapping("/setResHeader")
    public Mono<R> setResHeader(ServerWebExchange exchange) {
        exchange.getResponse().getHeaders().set("jwt","23546789555222");
        return Mono.just(R.suc("替换应答头中的业务字段"));
    }

    /**
     * 设置http返回码
     * @return
     */
    @GetMapping("/setStatus")
    public Mono<R> setStatus() {
        return Mono.just(R.suc("设置http返回码"));
    }

    /**
     * 设置重试机制
     * @return
     */
    @GetMapping("/setRetry")
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Mono<R> setRetry() {
        log.info("retry");
        return Mono.just(R.suc("设置重试机制"));
    }

    /**
     * 设置重试机制
     * @return
     */
    @PostMapping("/rsaDispath")
    public Mono<R> testSetBody(@RequestBody BizReqRSAMsg msg) {
        log.info("msg:{}",msg);
        return Mono.just(R.suc());
    }

    /**
     * 设置重试机制
     * @return
     */
    @PostMapping("/rsaDispathParam")
    public Mono<R> rsaDispathParam(String chl,String timestamp,String req,String sign) {
        log.info("chl:{},timestamp:{},req:{},sign:{}",chl,timestamp,req,sign);
        return Mono.just(R.suc(req));
    }
}
